home *** CD-ROM | disk | FTP | other *** search
/ Whiteline: Transmission / whiteline CD Series - Transmission.iso / utilitys / gamefix / assem.s next >
Text File  |  1995-06-07  |  12KB  |  457 lines

  1. ;*************************************************
  2. ;* Modulname      : ASSEM.S                      *
  3. ;* Autor          : Thomas Binder                *
  4. ;* Zweck          : Enthält den Assemblerteil    *
  5. ;*                  von GAMEFIX, insbesondere    *
  6. ;*                  die Routinen mpack und set,  *
  7. ;*                  die die im Artikel beschrie- *
  8. ;*                  benen Manipulationen zeigen  *
  9. ;* Compiler       : Pure Assembler 03.02.1992    *
  10. ;* Erstellt am    : 12.08.1993                   *
  11. ;* Letzte Änderung: 03.09.1993                   *
  12. ;*************************************************
  13.  
  14.     export  _gemdos,mpack,reset,ramsize
  15.     export  settings,get_settings,gdrout,set
  16.     export  ramsizes,new_pmmu_tree,mtype
  17.     export  rootpointer,checksum,get_ram
  18.     export  mtype
  19.  
  20.     ; Benötigte Systemvariablen und Hardware-
  21.     ; Register
  22.     equ     trap_1,$84
  23.     equ     memvalid,$420
  24.     equ     memcntrl,$424
  25.     equ     resvalid,$426
  26.     equ     phystop,$42e
  27.     equ     _memtop,$436
  28.     equ     _bootdev,$446
  29.     equ     sshiftmd,$44c
  30.     equ     _v_bas_ad,$44e
  31.     equ     _dskbufp,$4c6
  32.     equ     _sysbase,$4f2
  33.     equ     _longframe,$59e
  34.     equ        memconf,$ffff8001
  35.     
  36.     ; Indizes für das Settings-Feld
  37.     equ     datacache,0
  38.     equ     instcache,2
  39.     equ     blit8mhz,4
  40.     equ     cpu8mhz,6
  41.     equ     busmode,8
  42.     equ     timera,10
  43.     equ     mfpi7,12
  44.     equ     speaker,14
  45.     equ     scrbase,16
  46.     equ     volume,18
  47.     equ     ramconfig,20
  48.     
  49.     text
  50.  
  51.     ; Resetroutine für das Booten
  52.     ; Setzt die gewünschte Ramgrö₧e und führt
  53.     ; einen Reset aus
  54. MODULE reset
  55.     lea     settings,a0
  56.     ; Zur Ramgrö₧e gehörigen Wert nach
  57.     ; memcntrl und memconf schreiben
  58.     move.w  ramconfig(a0),d0
  59.     lea     ramcntrls,a0
  60.     move.b  (a0,d0.w),memcntrl.w
  61.     move.b  (a0,d0.w),memconf.w
  62.     lea     ramsizes,a0
  63.     move.l  (a0,d0.w*4),phystop.w
  64.     ; eventuelle andere Resetroutinen ausklinken
  65.     clr.l   resvalid.w
  66.     ; und ab zum Reset
  67.     move.l  _sysbase.w,a0
  68.     jmp     (a0)
  69.  
  70.     ; Werte für memcntrl und memconf für 512K,
  71.     ; 1MB, 2MB und 4MB
  72. ramcntrls:
  73.     dc.b    4,5,8,10
  74.     ; Die dazugehörigen Ramgrö₧en
  75. ramsizes:
  76.     dc.l    $80000,$100000,$200000,$400000
  77. ENDMOD
  78.  
  79.     ; Liest, soweit möglich, die alten Ein-
  80.     ; stellungen aus
  81. MODULE get_settings
  82.     lea     settings,a3
  83.     ; Testen, ob CPU mit 8MHz läuft
  84.     ; Nicht dokumentiert!
  85.     btst    #0,$ffff8007.w
  86.     bne.s   gs1
  87.     move.w  #1,cpu8mhz(a3)
  88. gs1:
  89.     ; BLiTTER mit 8MHz?
  90.     ; Nicht dokumentiert!
  91.     btst    #2,$ffff8007.w
  92.     bne.s   gs2
  93.     move.w  #1,blit8mhz(a3)
  94. gs2:
  95.     ; ST(E)-Busmodus aktiv?
  96.     ; Nicht dokumentiert!
  97.     btst    #5,$ffff8007.w
  98.     bne.s   gs3
  99.     move.w  #1,busmode(a3)
  100. gs3:
  101.     movec   cacr,d0
  102.     ; Befehlscache aktiv?
  103.     btst    #0,d0
  104.     beq.s   gs4
  105.     move.w  #1,instcache(a3)
  106. gs4:
  107.     ; Datencache aktiv?
  108.     btst    #8,d0
  109.     beq.s   gs5
  110.     move.w  #1,datacache(a3)
  111. gs5:
  112.     ; Interner Lautsprecher an?
  113.     ; Nicht dokumentiert!
  114.     move.w  #14,-(sp)
  115.     move.l  #$1c0000,-(sp)
  116.     trap    #14
  117.     addq.l  #6,sp
  118.     btst    #6,d0
  119.     bne.s   gs6
  120.     move.w  #1,speaker(a3)
  121. gs6:
  122.     ; Timer A für DMA-Sound?
  123.     ; Nicht dokumentiert!
  124.     btst    #2,$ffff8900.w
  125.     beq.s   gs7
  126.     move.w  #1,timera(a3)
  127. gs7:
  128.     ; MFP-Interrupt 7 für DMA-Sound?
  129.     ; Nicht dokumentiert!
  130.     btst    #0,$ffff8900.w
  131.     beq.s   gs8
  132.     move.w  #1,mfpi7(a3)
  133. gs8:
  134.     ; Welchen Monitor haben wir denn?
  135.     move.w  #89,-(sp)
  136.     trap    #14
  137.     addq.l  #2,sp
  138.     move.w  d0,mtype
  139.     jmp     get_ram(pc)
  140. ENDMOD
  141.  
  142. MODULE get_ram
  143.     ; Ramgrö₧e des Falcon bestimmen
  144.     ; Nicht dokumentiert!
  145.     move.w  $ffff8006.w,d0
  146.     lsr.w   #8,d0
  147.     lsr.b   #1,d0
  148.     move.b  d0,d1
  149.     andi.b  #1,d1
  150.     lsr.b   #2,d0
  151.     andi.b  #6,d0
  152.     or.b    d0,d1
  153.     move.l  #$80000,d0
  154.     asl.l   d1,d0
  155.     cmpi.b  #5,d1
  156.     bne.s   no16mb
  157.     ; Wenn es 16MB sind, "klaut" uns das TOS
  158.     ; durch seine Lage 2 Megabyte :-(
  159.     move.l  #$e00000,d0
  160. no16mb:
  161.     rts
  162. ENDMOD
  163.  
  164.     data
  165.  
  166.     ; Diese Routine wird im Speicher als
  167.     ; "Magic-Pack" plaziert und nach dem Reset
  168.     ; vor den AUTO-Ordner-Programmen ausgeführt
  169.     ; Hier werden dann die Einstellungen vorge-
  170.     ; nommen und auf Wunsch ein Diskettenboot-
  171.     ; sektor ausgeführt
  172. mpack:
  173.     movem.l d0-d3/a0-a4,-(sp)
  174.     ; Den neuen PMMU-Baum installieren
  175.     lea     rootpointer(pc),a0
  176.     pmove   (a0),crp
  177.     ; Sicherheitshalber den ATC löschen
  178.     pflusha
  179.     ; Dafür sorgen, da₧ die Prüfsumme des
  180.     ; "Magic Pack" zerstört wird
  181.     lea     checksum(pc),a0
  182.     clr.l   (a0)
  183.     ; Nächster Reset wird ein Kaltstart (aus
  184.     ; Sicherheitsgründen)
  185.     clr.l   memvalid.w
  186.     ; Eventuell die GEMDOS-Routine einklinken,
  187.     ; die dafür sorgt, da₧ die Bildschirmadresse
  188.     ; die gleiche wie beim ST(E) ist
  189.     lea     settings(pc),a4
  190.     tst.w   scrbase(a4)
  191.     beq.s   mp1
  192.     movec   vbr,a0
  193.     move.l  gdrout(pc),a3
  194.     move.l  trap_1(a0),-4(a3)
  195.     move.l  a3,trap_1(a0)
  196. mp1:
  197.     ; Die restlichen Einstellungen vornehmen
  198.     bsr.w   set
  199.     ; Je nach Monitortyp den richtigen Bildschirm-
  200.     ; modus einstellen (ST-hoch bei Monochrommoni-
  201.     ; tor, sonst ST-niedrig)
  202.     move.w  mtype(pc),d3
  203.     lea     modecodes(pc),a3
  204.     move.w  (a3,d3.w*2),-(sp)
  205.     move.w  #3,-(sp)
  206.     clr.l   -(sp)
  207.     clr.l   -(sp)
  208.     move.w  #5,-(sp)
  209.     trap    #14
  210.     lea     14(sp),sp
  211.     move.w  (a3,d3.w*2),-(sp)
  212.     move.w  #88,-(sp)
  213.     trap    #14
  214.     addq.l  #4,sp
  215.     ; Die Nachricht von GAMEFIX ausgeben und
  216.     ; auf Tastendruck warten
  217.     pea     msg(pc)
  218.     move.w  #9,-(sp)
  219.     trap    #1
  220.     addq.l  #6,sp
  221.     move.w  #8,-(sp)
  222.     trap    #1
  223.     addq.l  #2,sp
  224.     ; Wurde ESC gedrückt? Wenn ja, dann gleich
  225.     ; aufhören
  226.     cmp.b   #27,d0
  227.     beq.s   to_gem
  228.     ; Ansonsten Diskettenbootsektor einlesen und
  229.     ; ausführen, wenn er die richtige Prüfsumme
  230.     ; hat
  231.     move.l  _dskbufp,a3
  232.     pea     1.w
  233.     clr.w   -(sp)
  234.     pea     1.w
  235.     clr.l   -(sp)
  236.     pea     (a3)
  237.     move.w  #8,-(sp)
  238.     trap    #14
  239.     lea     20(sp),sp
  240.     move.w  #255,d0
  241.     moveq   #0,d1
  242. mp2:
  243.     add.w   (a3)+,d1
  244.     dbra    d0,mp2
  245.     cmpi.w  #$1234,d1
  246.     bne.s   to_gem
  247.     ; Bootdrive auf A: ändern und Bootsektor
  248.     ; ausführen
  249.     clr.w   _bootdev
  250.     jsr     -512(a3)
  251. to_gem:
  252.     movem.l (sp)+,d0-d3/a0-a4
  253.     rts
  254.  
  255. checksum:
  256.     dc.w    0
  257.  
  258.     ; Hier werden die Einstellungen vorgenommen,
  259.     ; die auch ohne Booten möglich sind
  260. set:
  261.     tst.w   mtype(pc)
  262.     bne.s   nomono
  263.     ; Am Monochrommonitor die Systemvariable
  264.     ; sshiftmd korrigieren
  265.     move.b  #$2,sshiftmd.w
  266. nomono:
  267.     lea     settings(pc),a4
  268.     ; Caches (de)aktivieren
  269.     move.l  #$0808,d0
  270.     or.w    datacache(a4),d0
  271.     or.w    instcache(a4),d0
  272.     movec   d0,cacr
  273.     ; CPU- und BLiTTER-Takt und Busmodus
  274.     ; setzen
  275.     ; Nicht dokumentiert!
  276.     move.b  #$40,d0
  277.     or.w    cpu8mhz(a4),d0
  278.     or.w    blit8mhz(a4),d0
  279.     or.w    busmode(a4),d0
  280.     move.b  d0,$ffff8007.w
  281.     ; Lautsprecher ein- bzw. ausschalten
  282.     ; Nicht dokumentiert!
  283.     move.w  #14,-(sp)
  284.     move.l  #$1c0000,-(sp)
  285.     trap    #14
  286.     addq.l  #6,sp
  287.     bclr    #6,d0
  288.     or.w    speaker(a4),d0
  289.     move.w  #$8e,-(sp)
  290.     move.w  d0,-(sp)
  291.     move.w  #$1c,-(sp)
  292.     trap    #14
  293.     addq.l  #6,sp
  294.     ; Wird alte Screenadresse gewünscht, vom
  295.     ; Betriebssystem die dazu nötige Anzahl von
  296.     ; Bytes anforden (undokumentierter GEMDOS-
  297.     ; Call) und die zurückerhaltene Adresse mit
  298.     ; Setscreen einstellen
  299.     tst.w   scrbase(a4)
  300.     beq.s   s1
  301.     pea     $7f00.w
  302.     move.w  #$15,-(sp)
  303.     trap    #1
  304.     addq.l  #6,sp
  305.     move.w  #-1,-(sp)
  306.     move.l  d0,-(sp)
  307.     move.l  d0,-(sp)
  308.     move.w  #5,-(sp)
  309.     trap    #14
  310.     lea     12(sp),sp
  311. s1:
  312.     ; Das Soundsubsystem korrekt für STE-DMA-
  313.     ; Sound initialisieren
  314.     move.w  #1,-(sp)
  315.     clr.l   -(sp)
  316.     pea     8.w
  317.     move.w  #$8b,-(sp)
  318.     trap    #14
  319.     lea     12(sp),sp
  320.     move.w  #3,-(sp)
  321.     move.l  #$820006,-(sp)
  322.     trap    #14
  323.     addq.l  #6,sp
  324.     move.w  #3,-(sp)
  325.     move.l  #$820005,-(sp)
  326.     trap    #14
  327.     addq.l  #6,sp
  328.     move.w  #3,-(sp)
  329.     move.l  #$820004,-(sp)
  330.     trap    #14
  331.     addq.l  #6,sp
  332.     ; Die gewünschte Lautstärke einstellen
  333.     move.w  volume(a4),-(sp)
  334.     move.l  #$820000,-(sp)
  335.     trap    #14
  336.     addq.l  #6,sp
  337.     move.w  volume(a4),-(sp)
  338.     move.l  #$820001,-(sp)
  339.     trap    #14
  340.     addq.l  #6,sp
  341.     ; Gewünschte(n) DMA-Interrupt(s)
  342.     ; einstellen
  343.     move.w  timera(a4),-(sp)
  344.     move.l  #$870000,-(sp)
  345.     trap    #14
  346.     addq.l  #6,sp
  347.     move.w  mfpi7(a4),-(sp)
  348.     move.l  #$870001,-(sp)
  349.     trap    #14
  350.     addq.l  #6,sp
  351.     ; _memtop auf ST(E)-üblichen Wert korrigieren
  352.     move.l  _v_bas_ad.w,_memtop.w
  353.     rts
  354.  
  355. mtype:
  356.     dc.w    0
  357. modecodes:
  358.     ; Die Codes für den Bildschirmmodus für
  359.     ; alle Monitortypen (Mono, RGB, VGA, TV)
  360.     ; Den 2. und 4. Wert in %10000010 ändern,
  361.     ; wenn 60Hz bzw. NTSC-Modus am RGB/TV
  362.     ; gewünscht ist
  363.     dc.w    %110001000,%10100010,%110010010
  364.     dc.w    %10100010
  365.     dc.w    $abdc
  366.     ; Hier stehen später die gewünschten
  367.     ; Einstellungen
  368. settings:
  369.     dc.w    0,0,0,0,0,0,0,0,0,0,0
  370.     ; Die Nachricht
  371. msg:
  372.     dc.b    27,"EGAMEFIX V1.00",13,10
  373.     dc.b    13,10,"Einstellungen vorgenommen,"
  374.     dc.b    "  zum  Booten"
  375.     dc.b    13,10,"jetzt die Disk einlegen und"
  376.     dc.b    " eine  Taste"
  377.     dc.b    13,10,"drücken (ESC zum direkten"
  378.     dc.b    "  Weitermachen"
  379.     dc.b    13,10,"ohne Booten)!"
  380.     dc.b    7,0
  381.     
  382.     even
  383.  
  384.     ; Adresse der GEMDOS-Routine für alte
  385.     ; Bildschrimadresse
  386. gdrout:
  387.     dc.l    0
  388.     ; Der neue PMMU-Rootpointer
  389. rootpointer:
  390.     dc.l    $80000002,$700
  391.     dc.w    $abcd
  392.  
  393.     ; Die GEMDOS-Routine, die für die alte
  394.     ; Bildschirmadresse sorgt
  395. _gemdos:
  396.     dc.b    "XBRAGfix"
  397. old_gemdos:
  398.     dc.l    0
  399. new_gemdos:
  400.     move.l  usp,a0
  401.     btst    #5,(sp)
  402.     beq.s   goon
  403.     
  404.     ; Wäre eigentlich nicht nötig, aber man
  405.     ; sollte es eigentlich immer so machen
  406.     lea     6(sp),a0
  407.     tst.w   _longframe.w
  408.     beq.s   goon
  409.     addq.l  #2,a0
  410. goon:
  411.     ; Wird die undokumentierte GEMDOS-Routine
  412.     ; mit der Screengrö₧e für ST-kompatible
  413.     ; Modi aufgerufen, einfach $200 addieren,
  414.     ; um 512 Bytes mehr zu erhalten und somit
  415.     ; die resultierende Adresse nach unten
  416.     ; zu drücken
  417.     cmpi.w  #$15,(a0)
  418.     bne.s   no_scrmem
  419.     cmp.l   #$7d00,2(a0)
  420.     bne.s   no_scrmem
  421.     addi.l  #$200,2(a0)
  422. no_scrmem:
  423.     move.l  old_gemdos(pc),-(sp)
  424.     rts
  425.     dc.w    $abcd
  426.  
  427.     ; Der PMMU-Baum, eine leicht geänderte Kopie
  428.     ; aus dem ROM: Alle mit $ffff beginnenden
  429.     ; Werte werden später als Offsets zur Baum-
  430.     ; adresse genommen, aus $ffff0042 wird also
  431.     ; Baumadresse + $40, die 2 ist ein PMMU-Flag
  432.     ; für 4-Byte-gro₧e Tabelleneinträge
  433.     ; Wer also will, kann den Baum auf diese Weise
  434.     ; abändern ;-)
  435.     ; Sollen beide Caches deaktiviert werden, wird
  436.     ; jeder Nicht-Offset-Wert mit $40 geodert, um
  437.     ; ein Cache-Inhibit zu erzielen
  438. new_pmmu_tree:
  439.     dc.l   $ffff0042,$10000001,$20000001,$30000001
  440.     dc.l   $40000001,$50000001,$60000001,$70000001
  441.     dc.l   $80000041,$90000041,$a0000041,$b0000041
  442.     dc.l   $c0000041,$d0000041,$e0000041,$ffff0082
  443.     dc.l   $ffff00c2,$01000001,$02000001,$03000001
  444.     dc.l   $04000001,$05000001,$06000001,$07000001
  445.     dc.l   $08000001,$09000001,$0a000001,$0b000001
  446.     dc.l   $0c000001,$0d000001,$0e000001,$0f000001
  447.     dc.l   $f0000041,$f1000041,$f2000041,$f3000041
  448.     dc.l   $f4000041,$f5000041,$f6000041,$f7000041
  449.     dc.l   $f8000041,$f9000041,$fa000041,$fb000041
  450.     dc.l   $fc000041,$fd000041,$fe000041,$ffff00c2
  451.     dc.l   $00000001,$00100001,$00200001,$00300001
  452.     dc.l   $00400001,$00500001,$00600001,$00700001
  453.     dc.l   $00800001,$00900001,$00a00001,$00b00001
  454.     dc.l   $00c00001,$00d00001,$00e00001,$00f00041
  455.  
  456. ; Modulende
  457.